package com.glsc.ngateway.platform.service.oaecology;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.glsc.ngateway.common.api.common.utils.PageUtil;
import com.glsc.ngateway.common.api.ldap.dto.LdapEhrEmpDto;
import com.glsc.ngateway.common.api.ldap.feign.IFeignLdapService;
import com.glsc.ngateway.common.api.ldap.resp.AppEhrResponse;
import com.glsc.ngateway.common.api.ldap.resp.LdapResponse;
import com.glsc.ngateway.common.base.domain.oracle.ecology.OaDemandFlowSum;
import com.glsc.ngateway.common.base.domainmapper.oaecology.OaDemandFlowSumMapper;
import com.glsc.ngateway.common.base.dto.oaecology.OaDemandFlowSumDto;
import com.glsc.ngateway.common.base.dto.oaecology.OaDemandFlowSumQueryDto;
import com.glsc.ngateway.common.base.repo.oracle.ecology.OaDemandFlowSumRepository;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 功能描述: OA需求相关流程汇总查询
 *
 * @author zzp
 * @date 2024/5/16
 */
@Service
public class OaDemandFlowSumService {

    @Resource
    private OaDemandFlowSumRepository oaDemandFlowSumRepository;

    @Resource
    private IFeignLdapService ehrService;

    public Page<OaDemandFlowSumDto> findPage(OaDemandFlowSumQueryDto queryDto) {
        int pageNo = PageUtil.initPageNo(queryDto.getPageNo());
        int pageSize = PageUtil.initPageSize(queryDto.getPageSize());

        //OA账号到OA ID的转换
        if (StrUtil.isNotEmpty(queryDto.getAssignUserOaAccount())) {
            AppEhrResponse<LdapEhrEmpDto> ehrEmp = ehrService.getLdapEhrEmp(queryDto.getAssignUserOaAccount(), null, false);
            if (ehrEmp != null && ehrEmp.getStatus() == 0 && ehrEmp.getData() != null && ehrEmp.getData().getOaUserId() != null) {
                queryDto.setAssignUserIdOa(ehrEmp.getData().getOaUserId().toString());
            }
        }

        if (StrUtil.isNotEmpty(queryDto.getCollaboratorUserOaAccount())) {
            AppEhrResponse<LdapEhrEmpDto> ehrEmp = ehrService.getLdapEhrEmp(queryDto.getCollaboratorUserOaAccount(), null, false);
            if (ehrEmp != null && ehrEmp.getStatus() == 0 && ehrEmp.getData() != null && ehrEmp.getData().getOaUserId() != null) {
                queryDto.setCollaboratorUserIdOa(ehrEmp.getData().getOaUserId().toString());
            }
        }


        if (StrUtil.isNotEmpty(queryDto.getCollaboratorUserOaAccount())) {
            AppEhrResponse<LdapEhrEmpDto> ehrEmp = ehrService.getLdapEhrEmp(queryDto.getCollaboratorUserOaAccount(), null, false);
            if (ehrEmp != null && ehrEmp.getStatus() == 0 && ehrEmp.getData() != null && ehrEmp.getData().getOaUserId() != null) {
                queryDto.setCollaboratorUserIdOa(ehrEmp.getData().getOaUserId().toString());
            }
        }

        if (StrUtil.isEmpty(queryDto.getRequestBeginDate())) {
            queryDto.setRequestBeginDate("2020-01-01");
        }

        if (StrUtil.isEmpty(queryDto.getRequestEndDate())) {
            queryDto.setRequestEndDate("2099-01-01");
        }

        Sort.Order sortOrder = new Sort.Order(Sort.Direction.DESC, "requestid");
        Sort sort = Sort.by(sortOrder);
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);
        Page<OaDemandFlowSum> page = oaDemandFlowSumRepository.page(queryDto, pageable);
        if (page == null || CollectionUtil.isEmpty(page.getContent())) {
            return Page.empty();
        }

        List<OaDemandFlowSumDto> resultDtoList = OaDemandFlowSumMapper.INSTANCE.domain2dto(page.getContent());

        //人员名称翻译
        Set<Integer> oaUserIdSet = new HashSet<>();
        StringBuilder oaUserIdStr = new StringBuilder();
        for (OaDemandFlowSumDto dto : resultDtoList) {
            if (null != dto.getFlowCreateIdOa()) {
                oaUserIdStr.append(dto.getFlowCreateIdOa()).append(",");
            }
            if (StrUtil.isNotEmpty(dto.getAssignUserIdListOa())) {
                oaUserIdStr.append(dto.getAssignUserIdListOa()).append(",");
            }
            if (StrUtil.isNotEmpty(dto.getCollaboratorIdListOa())) {
                oaUserIdStr.append(dto.getCollaboratorIdListOa()).append(",");
            }
        }
        Arrays.stream(oaUserIdStr.toString().split(",")).filter(StrUtil::isNotEmpty).forEach(id -> oaUserIdSet.add(Integer.parseInt(id)));

        LdapResponse<List<LdapEhrEmpDto>> userList = ehrService.getByOaUserIdList(oaUserIdSet.stream().collect(Collectors.toList()));
        Map<Integer, String> userMap = userList.getData().stream().collect(Collectors.toMap(LdapEhrEmpDto::getOaUserId, LdapEhrEmpDto::getName));
        for (OaDemandFlowSumDto dto : resultDtoList) {
            dto.setCreateUserName(userMap.get(dto.getFlowCreateIdOa()));
            if (StrUtil.isNotEmpty(dto.getAssignUserIdListOa())) {
                List<String> userNameList = new ArrayList<>();
                Arrays.stream(dto.getAssignUserIdListOa().split(",")).filter(StrUtil::isNotEmpty)
                        .forEach(id -> userNameList.add(userMap.get(Integer.parseInt(id))));

                dto.setAssignUserNameList(userNameList);
            }

            if (StrUtil.isNotEmpty(dto.getCollaboratorIdListOa())) {
                List<String> userNameList = new ArrayList<>();
                Arrays.stream(dto.getCollaboratorIdListOa().split(",")).filter(StrUtil::isNotEmpty)
                        .forEach(id -> userNameList.add(userMap.get(Integer.parseInt(id))));
                dto.setCollaboratorNameList(userNameList);
            }
        }


        Page<OaDemandFlowSumDto> resultPage = new PageImpl<>(resultDtoList, page.getPageable(), page.getTotalElements());
        return resultPage;
    }
}
